#ifndef SETTINGSMANAGER_H
#define SETTINGSMANAGER_H

#include <QObject>
#include <QString>
#include <QVariantMap>

class Config;
class SerialPortManager;
class DeviceManager;

/**
 * @brief 设置管理器类
 *
 * 提供系统设置界面所需的所有操作接口
 * 统一管理串口配置、总线配置和系统状态
 */
class SettingsManager : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool isPolling READ isPolling NOTIFY isPollingChanged)
    Q_PROPERTY(bool isScanning READ isScanning NOTIFY isScanningChanged)

public:
    explicit SettingsManager(Config *config,
                             SerialPortManager *portManager,
                             DeviceManager *deviceManager,
                             QObject *parent = nullptr);
    ~SettingsManager();

    /**
     * @brief 加载当前配置
     * @return 包含3个总线配置的Map
     */
    Q_INVOKABLE QVariantMap loadCurrentConfig();

    /**
     * @brief 应用新配置
     * @param bus1Port 配电室A串口
     * @param bus2Port 配电室B串口
     * @param bus3Port 配电室C串口
     * @param baudRate 波特率
     * @return 是否成功
     */
    Q_INVOKABLE bool applyConfiguration(const QString &bus1Port,
                                        const QString &bus2Port,
                                        const QString &bus3Port,
                                        int baudRate = 115200);

    /**
     * @brief 启动完整的系统初始化流程
     * @return 是否成功
     */
    Q_INVOKABLE bool startSystem();

    /**
     * @brief 停止系统运行
     */
    Q_INVOKABLE void stopSystem();

    /**
     * @brief 重启系统（停止后重新启动）
     * @return 是否成功
     */
    Q_INVOKABLE bool restartSystem();

    /**
     * @brief 检查配置是否有效
     * @param bus1Port 配电室A串口
     * @param bus2Port 配电室B串口
     * @param bus3Port 配电室C串口
     * @return 错误信息，为空表示有效
     */
    Q_INVOKABLE QString validateConfiguration(const QString &bus1Port,
                                              const QString &bus2Port,
                                              const QString &bus3Port);

    /**
     * @brief 获取系统运行状态
     * @return 状态描述
     */
    Q_INVOKABLE QString getSystemStatus();

    /**
     * @brief 是否正在轮询
     */
    bool isPolling() const { return m_isPolling; }

    /**
     * @brief 是否正在扫描
     */
    bool isScanning() const;

signals:
    /**
     * @brief 配置应用成功信号
     */
    void configurationApplied();

    /**
     * @brief 配置应用失败信号
     * @param errorMessage 错误信息
     */
    void configurationFailed(const QString &errorMessage);

    /**
     * @brief 系统状态改变信号
     * @param status 状态描述
     */
    void systemStatusChanged(const QString &status);

    /**
     * @brief 轮询状态改变信号
     */
    void isPollingChanged();

    /**
     * @brief 扫描状态改变信号
     */
    void isScanningChanged();

private slots:
    /**
     * @brief 处理拓扑识别完成
     */
    void onTopologyDiscoveryCompleted(int totalFound);

    /**
     * @brief 处理拓扑识别进度
     */
    void onTopologyDiscoveryProgress(int current, int total);

private:
    Config *m_config;
    SerialPortManager *m_portManager;
    DeviceManager *m_deviceManager;

    bool m_isPolling;
};

#endif // SETTINGSMANAGER_H
